package com.atguigu.tingshu.order.strategy;

import com.alibaba.fastjson.JSON;
import com.atguigu.tingshu.common.constant.RedisConstant;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.order.helper.SignHelper;
import com.atguigu.tingshu.vo.order.OrderInfoVo;
import com.atguigu.tingshu.vo.order.TradeVo;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * Author  王东剑
 * Created on 21/6/2024 PM6:37
 * Package_name com.atguigu.tingshu.order.strategy
 * Description
 */
public interface OrderTradeStrategy {
	/**
	 * 具体实现类
	 * @param tradeVo 前端传来的提交订单数据
	 * @return 进入结算页需要的数据
	 */
	OrderInfoVo trade(TradeVo tradeVo);

	/**
	 * 获取当前实现类的类型
	 * @return 实现类的类型
	 */
	String getItemType();

	default public void setOtherParameters(OrderInfoVo orderInfoVo, StringRedisTemplate redisTemplate){
		String tradeNo = UUID.randomUUID().toString().replaceAll("-", "");
		// 设置订单No
		orderInfoVo.setTradeNo(tradeNo);
		// 设置项目类型
		orderInfoVo.setItemType(getItemType());
		// 设置支付方式
		orderInfoVo.setPayWay(SystemConstant.ORDER_PAY_WAY_WEIXIN);
		// 设置时间戳
		orderInfoVo.setTimestamp(SignHelper.getTimestamp());
		Map<String,Object> map = JSON.parseObject(JSON.toJSONString(orderInfoVo), Map.class);
		// 设置签名
		orderInfoVo.setSign(SignHelper.getSign(map));
		// 将订单编号保存至 Redis,防止表单被重复提交
		redisTemplate.opsForValue().set(RedisConstant.getOrderRepeatValid(tradeNo),tradeNo,5, TimeUnit.MINUTES);
	}
}
